﻿//Declare global variables  
var geocoder = null;
var router = null;
var routePoints = [];
var routeID = null;
var startPointAlternatives = new Array();
var destinationPointAlternatives = new Array();
var startLoc = null;
var destLoc = null;

function goMap24() {
    Map24.loadApi(["core_api", "wrapper_api"], map24ApiLoaded);
}

function map24ApiLoaded() {
    //Byrjum á að stilla kortið á Ísland, hvað annað?
    Map24.MapApplication.setStartMapView({
        UpperLeftLongitude: -1479.8799999999985,
        UpperLeftLatitude: 4036.166949152537,
        LowerRightLongitude: -796.9807407407391,
        LowerRightLatitude: 3768.043220338978
    });

    Map24.MapApplication.init({ NodeName: "maparea" });

    //Fela hluti sem ekki á að sýna strax
    document.getElementById("geocodingResults").style.visibility = "hidden";
    document.getElementById("button_calculate_route").style.visibility = "hidden";
    Map24.MapApplication.Map.addListener("Map24.Event.MapClick", mapClicked);
}

//Routing fall sem sér um að reikna leiðina
function startRouting() {

    //Frumstilling array sem geymir punkta leiðar
    routePoints = {};
    //Create a geocoder stub
    if (geocoder == null) geocoder = new Map24.GeocoderServiceStub();

    //Tak við upphafs- og áfangastað frá viewi
    var start = Map24.trim($v("DestFromName"));
    var destination = Map24.trim($v("DestToName"));

    //Athuga hvort að innslegnir áfanga og upphafsstaðir séu tómir
//    if (start == "") { alert("Sláðu inn upphafsstað!"); return; }
//    if (destination == "") { alert("Sláðu inn áfangastað!"); return; }

    //Reikna upphafsstað route
    geocoder.geocode({
        SearchText: start,
        //Define a maximum number of geocoding results to limit
        //the number of entries that will be shown in the result lists
        MaxNoOfAlternatives: 5,
        CallbackFunction: printGeocodingResult,
        CallbackParameters: { position: "start" }
    });

    //Reikna áfangastað route
    geocoder.geocode({
        SearchText: destination,
        MaxNoOfAlternatives: 5,
        CallbackFunction: printGeocodingResult,
        CallbackParameters: { position: "destination" }
    });
}


//Callback fall sem kallað er í þegar Geocoding upplýsingar fyrir upphafss- og áfangastað eru þekktir
//Fallið prentar út alla möguleika sem passa við innslátt notanda sem hann hefur þá möguleika að velja nánar
function printGeocodingResult(locs, params) {

    //Yfirlýsing local breyta
    var county = null;
    var city = null;
    var zip = null;
    var street = null;
    var houseNo = null;
    var state = null;
    var result = "";

    //Loopað í gegnum addressur
    for (var i = 0; i < locs.length; i++) {
        //Access the fields of the geocoded address	
        county = locs[i].getCounty();
        city = locs[i].getCity();
        zip = locs[i].getZip();
        street = locs[i].getStreet();
        houseNo = locs[i].getHouseNo();
        state = locs[i].getState();
        lat = locs[i].getLatitude();
        lon = locs[i].getLongitude();

        //Ef addressfield er tómt er það ekki sýnt í niðurstöðum
        city == null ? city = "" : city = "" + city;
        zip == null ? zip = "" : zip = ", " + zip;
        street == null ? street = "" : street = ", " + street;
        houseNo == null ? houseNo = "" : houseNo = " " + houseNo;
        county == null ? county = "" : county = ", " + county;
        state == null ? state = "" : state = ", " + state;

        //Allt sett saman í lista
        result += "<option>" + city + state + zip + street + houseNo + county + "</option>";
    }

    //Prenta allar addressur út fyrir upphafsstað
    if (params.position == "start") {
        //Geyma í array
        for (var i = 0; i < locs.length; i++) {
            startPointAlternatives[i] = locs[i];
        }

        //Sýna upphafsstaði í lista
        if (Map24.Browser.IE)
        //Fyrir Internet Explorer:
            document.getElementById("geocodingresultsStart").outerHTML = '<select name="printGeocodingResult" id="geocodingresultsStart" style="width:350px;">' + result + '</select>';
        else
            document.getElementById("geocodingresultsStart").innerHTML = result;

    }

    //Prenta allar addressur út fyrir áfangastað
    else {
        //Geyma í array
        for (var i = 0; i < locs.length; i++) {
            destinationPointAlternatives[i] = locs[i];
        }
        //Sýna áfangastað í lista
        if (Map24.Browser.IE)
        //Fyrir Internet Explorer:
            document.getElementById("geocodingresultsDestination").outerHTML = '<select name="printGeocodingResult" id="geocodingresultsDestination" style="width:350px;">' + result + '</select>';
        else
            document.getElementById("geocodingresultsDestination").innerHTML = result;

        //Kveikja og slökkva á hnöppum
        document.getElementById("print").disabled = true;
        document.getElementById("geocodingresultsStart").style.visibility = "visible";
        document.getElementById("geocodingresultsDestination").style.visibility = "visible";
        document.getElementById("geocodingResults").style.visibility = "visible";
        document.getElementById("button_calculate_route").style.visibility = "visible";
        document.getElementById("button_calculate_route").disabled = false;

    }

}

//Þetta fall er notað þegar notandi smellir á leita. Að því loknu fer route reikningur fram.
function setRoutePoints() {
    
    var start = document.forms["start"]["geocodingresultsStart"].selectedIndex;
    var dest = document.forms["dest"]["geocodingresultsDestination"].selectedIndex;

    //Geyma valda staði í routePoints array
    routePoints["start"] = startPointAlternatives[start];
    routePoints["destination"] = destinationPointAlternatives[dest];

    //Hefja útreikning route
    calculateRoute();

    document.getElementById("button_show_list").disabled = true;
}

//Fall fyrir útreikning route
function calculateRoute() {

    if (router == null) router = new Map24.RoutingServiceStub();

    //Reikna rout 
    router.calculateRoute({
        Start: routePoints["start"],
        Destination: routePoints["destination"],
        CallbackFunction: displayRoute,
        //ShowRoute er sett í false og route er ekki sýnd sjálfkrafa. M.a. nauðsynlegt ef breyta á default lit ofl.
        ShowRoute: false
    });

    document.getElementById("print").disabled = true;
    document.getElementById("button_calculate_route").disabled = true;
}

//Fall sem sýnir route á korti
function displayRoute(route) {

    //Muna routeID t.d. til að fela route seinna eða eyða
    routeID = route.RouteID;

    //Leiðin sýnd með bleikum lit. Seinna gildið er transparency
    router.showRoute({
        RouteId: routeID,
        Color: ['#F09', 150]
    });

    //Upphafspunktur route
    startLoc = new Map24.Location({
        Longitude: routePoints["start"].getLongitude(),
        Latitude: routePoints["start"].getLatitude(),
        Description: "Start Point",
        SymbolId: 20950
    });
    startLoc.commit();
    //    document.getElementById("ToLongitude").innerHTML = startLoc.Longitude;
    var startLocLong = startLoc.getLongitude();
    var startLocLat = startLoc.getLatitude();

    //Áfangastaður route
    destLoc = new Map24.Location({
        Longitude: routePoints["destination"].getLongitude(),
        Latitude: routePoints["destination"].getLatitude(),
        Description: "Destination Point",
        SymbolId: 20958
    });
    destLoc.commit();
//    document.getElementById("FromLatitude").innerHTML = destLoc.Latitude;

    var destLocLong = destLoc.getLongitude();
    var destLocLat = destLoc.getLatitude();

    //Reikna út áætlaðann tíma sem tekur að aka leiðina
    var totalTime = ((route.TotalTime) / (60 * 60)).toPrecision(3)
    //Fá kílómetra ferðarinnar
    var totalLength = (route.TotalLength / 1000)
    //Búa til töflu með leiðarlýsingu
    var div_content = "Total Time: " + totalTime + " h<br>";
    div_content += "Total Length: " + totalLength + " km<br>";
    div_content += "Start Longitude: " + startLocLong + " <br>";
    div_content += "Start Latitude: " + startLocLat + " <br>";
    div_content += "Destination Longitude: " + destLocLong + " <br>";
    div_content += "Destination Latitude: " + destLocLat + " <br>";
    div_content += "<br>";

    //For slaufa sem skrifar út leiðarlýsingu
        for (var i = 0; i < route.Segments.length; i++) {
        if (typeof route.Segments[i].Coordinates != "undefined") {

            //Lengdar- og breiddargráða segmentanna
            var longitudes = route.Segments[i].Coordinates.Longitudes.toString().split("|");
            var latitudes = route.Segments[i].Coordinates.Latitudes.toString().split("|");

            //Lengdar- og breiddargráða hálfrar leiðar
            //Nauðsynlegt til að miðja leiðina
            var centerLon = longitudes[parseInt(longitudes.length / 2)];
            var centerLat = latitudes[parseInt(latitudes.length / 2)];
        }

        //Fyrir hvern hluta leiðarinnar, finna leiðarlýsingu og miðjun leiðarhlutans
        for (var j = 0; j < route.Segments[i].Descriptions.length; j++) {

            div_content += (i + 1) + ". " + route.Segments[i].Descriptions[j].Text.replace(/(\[|\[\/)[0-9A-Z_]+\]/g, '')
        + "<img src=\"/images/ms/centerabove_std.gif\" alt=\"Center\" onclick=\"centerOnSegment(" + centerLon + ", " + centerLat + ");\"/><br>"
        }
    }

    document.getElementById('routeDescription').innerHTML = div_content;
    document.getElementById("button_hide_route").disabled = false;
    document.getElementById("button_remove_route").disabled = false;
    document.getElementById("print").disabled = false;
    document.getElementById("Distance").value = totalLength;
    document.getElementById("DestFromLong").value = startLocLong;
    document.getElementById("DestFromLat").value = startLocLat;
    document.getElementById("DestToLong").value = destLocLong;
    document.getElementById("DestToLat").value = destLocLat;

}

//fall sem miðjar leiðarhluta
function centerOnSegment(centerLon, centerLat) {
    //Center on the given variable
    Map24.MapApplication.center({ Coordinate: new Map24.Coordinate(centerLon, centerLat), MinimumWidth: 3034 });
}

function showRoute() {
    //Show the route. 
    router.showRoute({ RouteId: routeID });
    startLoc.show();
    destLoc.show();

    document.getElementById("button_show_route").disabled = true;
    document.getElementById("button_hide_route").disabled = false;
    document.getElementById("button_remove_route").disabled = false;
}

function hideRoute() {
    //fela route
    router.hideRoute({ RouteId: routeID });
    startLoc.hide();
    destLoc.hide();

    document.getElementById("button_show_route").disabled = false;
    document.getElementById("button_hide_route").disabled = true;
    document.getElementById("button_remove_route").disabled = true;
}

//Eyðir leið
function removeRoute(routeID) {
    
    router.removeRoute({ RouteId: routeID });
    //Eyðir upphafs- og endastöðum
    startLoc.remove();
    destLoc.remove();

    //Eyða leiðarlýsingu 
    document.getElementById("routeDescription").innerHTML = "";

    //Endurhlaða hnappa
    document.getElementById("button_show_route").disabled = true;
    document.getElementById("button_hide_route").disabled = true;
    document.getElementById("button_remove_route").disabled = true;
    document.getElementById("button_calculate_route").style.visibility = "visible";
    document.getElementById("button_calculate_route").disabled = false;
    document.getElementById("button_show_list").style.visibility = "visible";
    document.getElementById("button_show_list").disabled = false;
    document.getElementById("print").disabled = true;
}

//Prenta leiðarlýsingu þegar smellt er á prenta
function printRouteDescription() {
    var printContent = document.getElementById("routeDescription");
    var windowPrint = window.open('', '', 'left=0,top=0,width=0,height=0,toolbar=0,scrollbars=0,status=0');
    windowPrint.document.write(printContent.innerHTML);
    windowPrint.document.close();
    windowPrint.focus();
    windowPrint.print();
    windowPrint.close();
}

//Hjálparfall til að taka við div hlutum sem skilgreind eru í id="" hlutanum.
//Fyrst athugað hvort div id sé tómt
function $v(id) {
    return (document.getElementById(id).value != "undefined") ?
        document.getElementById(id).value : "";
}